import java.util.Scanner;
//异常处理的流程
/**
 * 程序先执行 try 中的代码
 * 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
 * 如果找到匹配的异常类型, 就会执行 catch 中的代码
 * 如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
 * 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
 * 如果上层调用者也没有处理的了异常, 就继续向上传递.
 * 一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止.
 */
public class TestDemo2 {
    //如果当前方法中没有适合的处理异常的方式，就会沿着调用栈向上传递
    //fuc2()没有处理到这个异常,则会沿着栈向上传递,回到main函数,如果main函数也没处理异常,则会交给jvm来进行处理
    public static void func2(){
        try{
            System.out.println(10/0);
        }catch(NullPointerException e){
            e.printStackTrace();
        }finally{

        }
    }

    public static void main(String[] args) {
        func2();
        //进行处理异常
//        try{
//            func2();
//        }catch(ArithmeticException e){
//
//        }
    }

    public static int func(){
        try{
            int a = 10;
            return a;
        }catch(NullPointerException a){
            a.printStackTrace();
        }finally{
            return 9;//不要再finally当中进行return
//            一定会折行，也就是说会先折行return 9；
        }
    }

    public static void main2(String[] args) {
        System.out.println(func());
    }
    public static void main1(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {//小括号里面可以放资源,这时候就不需要close了
            //try里放可能会发生的异常
            int a = 10;
            int b = scanner.nextInt();
            System.out.println(a / b);
            int[] array = {1, 2, 3};
            System.out.println(array[100]);
            System.out.println("抛出的异常被捕获后这里不会被执行了");
        } catch (ArithmeticException e) {
            //捕获对应的异常
            System.out.println("捕获了算数异常");
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();//可以将捕获的异常打印出来,打印顺序无序
            System.out.println("捕获了ArrayIndexOutOfBoundsException异常");
        } finally {
            //finally里面的代码,一定会被执行
            System.out.println("1234");
            System.out.println("所以finally一般来释放资源,比如:关闭文件");
            //scanner就是个资源
            //scanner.close();需要释放
        }
        System.out.println("eeesss");
        //也可以捕获多个异常
        //catch(ArithmeticException | ArrayIndexOutOfBoundsException e){}

        //可以用一个catch捕获所有异常(不推荐),因为你不知道这捕获的会是啥异常,范围太大了
        //catch(Exception e){}
    }
}
